EfficientNet:Rethinking model scaling for convolutional neural networks

这篇论文一经出现就引起了广泛的关注,在ImageNet上取得了State-of-the-art的性能,并且网络的参数量以及FlOPs都大幅度降低。虽然经过实际测试后,发现推理速度很慢,占用显存也很高。最近出的RegNet就说明了这个问题。废话不多说,下面对该论文进行详细的介绍。

创新点

  • 系统地研究了model scaling,发现平衡网络深度、宽度和分辨率可以带来更好的性能
  • 使用神经网络搜索算法搜索出一个新的baseline network,并通过model scale的方式扩展得到一系列模型,称为EfficientNets
  • EfficientNet-B7在ImageNet数据集上取得了State-of-the-art的性能,并且比现有的最好的模型参数量小8.4倍,推理速度快了6.1倍。EfficientNet的迁移学习能力也很强。

创新点来源

Scaling up ConvNets被广泛的应用来得到更好的精度。例如使用更多的层将ResNet-18提升到ResNet-200;最近的GPipe通过scaling up一个baseline model四倍在ImageNet数据集上取得了84.3%的top-1精度。

但如何scaling up卷积网络从来没有详细研究过。目前大概有三种方式scaling up模型:height、width、图像分辨率。之前的工作都是扩大上面三项中的其中一项。但是直观感觉,网络宽度、深度、分辨率有一种特定的关系。例如,当扩大输入图像尺寸时,网络需要更多的层增加感受视野、更宽的层得到更精细的特征。

虽然可以任意sacling up二项或三项,但这需要繁琐的手动调整,并且经常产生次优的精度和效率。所以本文致力于系统的研究scaling up网络的过程,探索scaling up模型的时候网络深度、宽度、分辨率之间的内在关系。

Compound Model Scaling

作者一系列的实验发现平衡网络的深度、宽度以及分辨率特别重要,并且这种平衡可以通过简单地以恒定的比例sacling up它们中的每一项来实现。这种scaling up的方法作者称为Compound Model Scaling。下面进行详细的介绍。

问题定义

CNN中的第$i$层的操作可以定义为$Y_i={\cal F}_i(X_i)$,${\cal F}_i$为操作符,$Y_i$为输出tensor,$X_i$是大小为$\left$的输入tensor。那么整个CNN可以表示为:

另外,CNN模型通常被划分为多个stages,每一个stage中的所有层结构相同。例如,ResNet一共有5个stage,每一个stage中的所有层结构相同。因此,上式还可以简化为:

其中,${\cal F}_i^{L_i}$表示层${\cal F}_i$在stage $i$重复$L_i$次;$\left$表示第$i$层的输入tensor维度;一共有$s$个stage。

为了减小搜索空间,先固定了网络的基本结构,而只改变三个缩放维度。然而这仍然是一个巨大的搜索空间——需要为每一层探索不同的$L_i,C_i,H_i,W_i$。为了进一步减小搜索空间,约束一个卷积网络所有的卷积层必须通过相同的比例常数进行统一扩展,意思是,采用一个统一的缩放因子$d,w,r$对网络每一层进行扩展。在给定的资源限制下,我们的目标是最大化模型精度,该优化问题写成方程的形式如下:

image-20200507223858577

其中,$w,d,r$为scaling network时的宽度、深度以及分辨率系数;$\hat { {\cal F}_i},\hat {L_i},\hat {H_i},\hat {W_i},\hat {C_i}$为在baseline network中预定义的网络参数。

总结来说,为了减少网络的搜索空间,作者固定了网络的基本结构,只改变三个缩放维度;为了进一步减少搜索空间,每一层的$L_i,C_i,H_i,W_i$约束为统一的$w,d,r$。

Scaling Dimensions

Depth ($d$):Scaling network depth是最常用的方式。直觉上,更深的网络能够捕捉到更充足更复杂的特征,泛化性能较好。但是更深的网络面临着梯度消失问题,虽然可以使用skip connections、batch normalization减轻这个问题。但是很深的网络对精度增益很小,例如ResNet-1000的精度和ResNet-101的精度很接近。图3(中)为在baseline model上采用不同的depth coefficients $d$ 的结果,这也展示了很深的网络对精度增益没有作用。

Width ($w$):更宽的网络能够捕捉到更加精细的特征,而且更加容易去训练,但是浅层网络不能捕捉到更抽象的特征。图3(左)是在baseline model上采用不同的width coefficients $w$ 的结果。这表明当网络变得越来越宽时,精度迅速饱和。

Resolution ($r$):更高分辨率的输入图片,CNN能够捕捉到更加精细化的特征。图3(右)我们在baseline model上采用不同的resolution $w$ 的结果。$r=1.0$表示分辨率为$224 \times 224$。可以看到,增大resolutions,确实可以提高精度,但是当resolution特别高时,精度的增益很少。

image-20200507212059634

因此可以得到第一个重要的结论:三个维度中任一维度的放大都可以带来精度的提升,但是随着倍率的越来越大,提升越来越小。

Compound Scaling

直觉上,这三个维度并不是独立的。为了验证这个直觉,比较了在不同网络深度和分辨率下,scaling 网络宽度的结果。如下图所示,当没有改变网络宽度($d=1.0$)和分辨率($r=1.0$)时,而只scale network width $d$ ,精度迅速饱和。同样FLOPs下,在更深的网络和更高的分辨率下,width scaling能够得到更好的精度。

image-20200507213000014

因此可以得到第二个重要的结论:得到更高精度和效率模型的关键是平衡宽度,深度,分辨率三个维度的缩放倍率

之前也有文章尝试平衡网络深度和宽度,但是这需要繁琐的手工调优过程。本文提出了一个新的compound scaling method,使用一个compound coefficient $\phi$ 去对这三个维度进行统一scaling,表达式如下:

image-20200507223812152

其中,$\alpha,\beta,\gamma$ 是常数,可以通过grid search得到。直观理解,$\phi$ 用来控制model scaling时有多少资源可以利用,$\alpha,\beta,\gamma$ 表示如何分配这些资源给网络的深度、宽度以及分辨率。

值得注意的是,一个普通卷积操作的FLOPs和$d,w^2,r^2$成正比。即当网络的深度变为之前的两倍时,FLOPs也变为之前的两倍,但是当网络的宽度和分辨率变为之前的两倍时,FLOPs变为之前的四倍。使用上式scaling model时,FLOPs近似为之前的$\alpha \cdot \beta^2 \cdot \gamma^2$倍。本文让$\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2$,因此总的FLOPs近似为之前的$2^\phi$倍。

补充知识:

FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。

FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。

对于卷积层而言,FLOPs计算如下,假设输入的tensor 维度为$H_i \times W_i \times C_i$,卷积核大小为$K$,步长为$S$,单边padding大小为$P$,输出特征图大小为$H_o \times W_o \times C_o$。对于输出特征图的每个像素点,所需要的乘法运算数为$C_i \times K^2$;因为$n$个数相加,只需要$n-1$次加法,所以考虑bias,则所需要的加法运算数为$C_i \times K^2$;若不考虑bias,则所需要的加运算数为$C_i \times K^2 -1$。则不考虑bias时,卷积操作的FLOPs为:

而有$H_o=(H_i-F+2P)/S+1$ ,$W_o=(W_i-F+2P)/S+1$ (取不尽的卷积向下取整,池化层向上取整)。所以一个普通卷积操作的FLOPs和$d,w^2,r^2$成正比。

对于全连接层而言,假设输入tensor维度为$I$,神经元个数为$O$。对于输出特征图的每一个像素点,所需要的乘法操作为$I \times O$;因为$n$个数相加,只需要$n-1$次加法,所以考虑bias,则所需要的加法运算数为$I \times O$;若不考虑bias,则所需要的加运算数为$I \times O -1$。则不考虑bias时,FC操作的FLOPs为:

EfficientNet Architecture

作者使用一个多目标模型搜索算法同时优化精度和FLOPs,优化的目标函数为$ACC(m) \times \left[ FLOPs(m)/T \right]^w$。其中,$m$表示模型,$T$为目标FLOPs,而$w$则表示在精度和FLOPs之间做一个trade-off。EfficientNet使用了MobileNet V2中的mobile inverted bottleneck——MBConv作为模型的主干网络,同时也用了SENet中的squeeze and excitation方法对网络结构进行了优化。

网络搜索不是本文的重点,所以这里一笔带过了。

综合了MBConv和squeeze and excitation方法的EfficientNet-B0的网络结构如下表所示:

image-20200507223229167

从EfficientNet-B0开始,运用compound scaling method对模型进行scale up。主要分为两个步骤:

  • 固定$\phi=1$,假定可用资源扩大两倍,基于公式(2)和公式(3)对$\alpha,\beta,\gamma$做一个grid search,在$\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2$约束下,最优组合为$\alpha=1.2,\beta=1.1,\gamma=1.15$。
  • 固定$\alpha,\beta,\gamma$为上面的最优常数组合,使用公式(3) 利用不同的$\phi$得到EfficientNet-B1到B7。

值得注意的是,直接在更大的模型上搜索$\alpha,\beta,\gamma$,可以得到更好的精度。但是搜索代价过大。本文通过只在最小baseline model上搜索出一组最优组合。对于其它的模型,scaling up时都使用这同一最优组合。

实验结果

EfficientNet在ImageNet上的表现。和现有的模型相比,在相同精度下,EfficientNet的模型和参数量均少了一个数量级。EfficientNet-B7模型在只有66MB参数量以及37B FLOPs下取得了State-of-art的性能。

image-20200507224714487

推理时间比较。EfficientNet-B1比ResNet-152快了5.7倍,EfficientNet-B7比GPipe快了6.1倍。但是需要注意的是,本文是在CPU上进行测试的

image-20200507225345164

使用Compound Model Scaling方法在MobileNets和ResNets进行验证。和单一维度的sacling model方法,本文所提方法在所有模型上均取得了更高的性能。

image-20200507224925236

Discussion

为了更好的理解为什么本文所提的Compound Model Scaling方法比单独提高任一维度的性能好,下图比较了EfficientNet-B0在不同scaling方法下的结果。总体上,随着FLOPs的增加,所有的scalig method都提高了精度。但是本文所提方法更能进一步提高精度。

image-20200507230225708

将不同scaling method方法得到的模型的activation map进行可视化,如下图所示,本文所提方法能够关注到更多相关区域、更多的目标细节。其他的方法或者缺少目标细节,或者不能捕捉到图像中的所有物体。

image-20200507230635324

总结

本文首先系统的研究了model scaling方法,通过直观感觉以及实验验证的方式证明了平衡网络深度、宽度、分辨率对于提高模型精度和性能特别重要。

虽然可以任意sacling up二项或三项,但这需要繁琐的手动调整,并且仍然经常产生次优的模型,为了解决这个问题,作者引入了模型搜索方法。但是模型搜索空间过大,为了解决这个问题,作者采用了如下几个技巧:

  • 固定网络的基本结构,采用MobileNet V2中的mobile inverted bottlenetck——MBConv作为模型的主干网络,同时也用了SENet中的squeeze and excitation方法对网络结构进行了优化。只改变三个缩放维度;
  • 为了进一步减少搜索空间,每一层的$L_i,C_i,H_i,W_i$约束为统一的$w,d,r$。借助于$w,d,r$对FLOPs的贡献不同,使用参数$\phi$对$w,d,r$进行统一约束。
  • 只在EfficientNet-B0上通过grid search的方法搜索出一组最优的$w,d,r$,之后scaling up model时都采用这一组最优组合,只改变$\phi$的值即可,避免在大模型上搜索$w,d,r$。

参考

CNN 模型所需的计算力(flops)和参数(parameters)数量是怎么计算的? - chen liu的回答 - 知乎

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道